package xjf.learn.stream;

import org.junit.Test;
import xjf.base.entity.Employee;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * 1.filter: 根据指定条件进行过滤，接收的是一个 Predicate 的函数式接口
 * 2.limit: 限制个数,使其元素不超过n个
 * 3.skip: 跳过前n个元素，然后再开始执行。若流中元素不足n个，则返回一个空流。与 limit(n) 互补
 * 4.distinct：进行去重，不过去重依据是根据 hashCode 和 equals 方法判断的，因此需要重写这两个方法达到去重
 *
 * @Author: xjf
 * @Date: 2020/4/12 17:48
 */
public class Test1 {

    /**
     * 数据准备
     */
    private List<Employee> employeeList = Arrays.asList(
            new Employee("张三", 45, 6000),
            new Employee("李四", 20, 7600),
            new Employee("王五", 38, 4900),
            new Employee("赵六", 77, 2000),
            new Employee("田七", 54, 6500),
            new Employee("田七", 54, 6500)
    );

    /**
     * 1. 过滤操作 filter
     *
     * 内部迭代：迭代操作由Stream API完成
     */
    @Test
    public void test1() {
        //中间操作：没有终止操作时不会执行任何操作
        Stream<Employee> employeeStream
                = employeeList.stream()
                .filter(e -> e.getAge() > 35);

        //终止操作：一次性执行全部操作，即“惰性求值”
        employeeStream.forEach(System.out::println);
    }

    /**
     * 2. limit: 会有短路
     */
    @Test
    public void test2() {
        // 不加 limit 时
        employeeList.stream()
                .filter(e -> {
                    System.out.println("执行 filter ");
                    return e.getSalary() > 5000;
                })
                .forEach(System.out::println);

        System.out.println("================================ 分隔线 =================================");
        employeeList.stream()
                .filter(e -> {
                    System.out.println("执行 filter ");
                    return e.getSalary() > 5000;
                })
                .limit(2)
                .forEach(System.out::println);
    }

    /**
     * 3. skip
     */
    @Test
    public void test3(){
        employeeList.stream()
                .filter(e -> e.getSalary() > 5000)
                .skip(2)
                .forEach(System.out::println);
    }

    /**
     * 4. distinct 去重: hashCode 和 equals 重写
     */
    @Test
    public void test5() {
        // 未去重时
        employeeList.stream()
                .filter(e -> e.getSalary() > 5000)
                .skip(2)
                .forEach(System.out::println);

        System.out.println("================================ 分隔线 =================================");

        // 去重了
        employeeList.stream()
                .filter(e -> e.getSalary() > 5000)
                .skip(2)
                .distinct()
                .forEach(System.out::println);
    }
}
